"""
配置管理模块
负责加载和管理应用配置
"""

import os
from dataclasses import dataclass
from typing import List, Optional

from dotenv import load_dotenv

from ragflow_client.utils.logger import get_logger
from ragflow_client.utils.config_util import load_env_file, save_env_variable

logger = get_logger(__name__)


@dataclass
class RagFlowConfig:
    """RagFlow 配置类"""
    api_url: str
    api_key: str
    kb_id: str
    kb_name: str
    parser_id: str
    doc_dir: str
    doc_suffix: List[str]
    debug: bool = False
    theme: str = "light"  # 主题: light, dark, 未来可添加更多
    
    @property
    def dark_mode(self) -> bool:
        """兼容旧版本的dark_mode属性"""
        return self.theme == "dark"
    
    @dark_mode.setter
    def dark_mode(self, value: bool):
        """兼容旧版本的dark_mode设置"""
        self.theme = "dark" if value else "light"

    @classmethod
    def from_env(cls) -> "RagFlowConfig":
        """从环境变量加载配置"""
        # 使用配置工具加载.env文件，确保在打包后也能正确加载
        load_env_file()
        
        # 打印环境变量，用于调试
        logger.debug(f"DEBUG环境变量: {os.getenv('DEBUG')}")
        logger.debug(f"THEME环境变量: {os.getenv('THEME')}")
        
        debug = os.getenv("DEBUG", "false").lower() == "true"
        
        # 处理主题设置，兼容旧版本的DARK_MODE
        theme = os.getenv("THEME", "")
        if not theme:
            # 如果没有THEME环境变量，尝试使用DARK_MODE
            dark_mode = os.getenv("DARK_MODE", "false").lower() == "true"
            theme = "dark" if dark_mode else "light"
        
        api_url = os.getenv("RAGFLOW_API_URL", "")
        api_key = os.getenv("RAGFLOW_API_KEY", "")
        kb_id = os.getenv("RAGFLOW_KB_ID", "")
        kb_name = os.getenv("RAGFLOW_KB_NAME", "")
        parser_id = os.getenv("RAGFLOW_PARSER_ID", "naive")
        doc_dir = os.getenv("RAGFLOW_DOC_DIR", "")
        doc_suffix_str = os.getenv("RAGFLOW_DOC_SUFFIX", "md,txt,pdf,docx")
        doc_suffix = [s.strip() for s in doc_suffix_str.split(",")]
        
        # 打印解析后的值，用于调试
        logger.debug(f"解析后的主题设置: {theme}")
        
        config = cls(
            debug=debug,
            theme=theme,  # 使用theme参数而不是dark_mode
            api_url=api_url,
            api_key=api_key,
            kb_id=kb_id,
            kb_name=kb_name,
            parser_id=parser_id,
            doc_dir=doc_dir,
            doc_suffix=doc_suffix
        )
        
        config.validate()
        config.log_config()
        return config
    
    def validate(self) -> None:
        """验证配置是否有效"""
        # 记录当前配置
        logger.debug(f"验证配置: theme={self.theme}")
        
        # 只在文档目录有值时才验证其存在性
        if self.doc_dir and not os.path.exists(self.doc_dir):
            logger.warning(f"文档目录不存在: {self.doc_dir}")
            # 不抛出异常，只记录警告
    
    def log_config(self) -> None:
        """记录配置信息"""
        logger.info("RagFlow 配置加载完成")
        logger.debug(f"调试模式: {self.debug}")
        logger.debug(f"主题: {self.theme}")
        logger.debug(f"API URL: {self.api_url}")
        logger.debug(f"KB ID: {self.kb_id}")
        logger.debug(f"KB 名称: {self.kb_name}")
        logger.debug(f"解析器 ID: {self.parser_id}")
        logger.debug(f"文档目录: {self.doc_dir}")
        logger.debug(f"文档后缀: {self.doc_suffix}")
